/* class 类名
---------------------------------------------------------------- */
/**
 * 类名 判断是否有该类名
 * @param {Element} elmment dom元素对象
 * @param {string} cls 类名
 * @returns {boolean}
 */
export function hasClass({ element, cls }: { element: any; cls: string }) {
  return !!element.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
}

/**
 * 类名 增加
 * @param {Element} element dom元素对象
 * @param {string} cls 类名
 */
export function addClass({ element, cls }: { element: any; cls: string }) {
  if (!hasClass({ element, cls })) element.className += ' ' + cls
}

/**
 * 类名 删除
 * @param {Element} element dom元素对象
 * @param {string} cls 类名
 */
export function removeClass({ element, cls }: { element: any; cls: string }) {
  if (hasClass({ element, cls })) {
    const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
    element.className = element.className.replace(reg, ' ')
  }
}

/* distance距离
---------------------------------------------------------------- */
/**
 * 获取 获取盒子在页面的相对高度
 * @param {Element}  element dom元素对象
 * @returns {Number} 相对高度
 */
export function getTopOffset({ element }: { element: any }) {
  if (!element) return

  let top = element.offsetTop
  let parent = element.offsetParent
  while (parent !== null) {
    top += parent.offsetTop
    parent = parent.offsetParent
  }

  return top
}

/**
 * 获取dom距离到浏览器最左边的距离
 * @param { element } Object dom元素对象
 * @returns {Number} 距离
 */
export function getOffsetLeft({ element }: { element: any }) {
  let actualLeft = element.offsetLeft
  let current = element.offsetParent
  while (current !== null) {
    actualLeft += current.offsetLeft
    current = current.offsetParent
  }
  return actualLeft
}

/**
 * 获取dom距离到浏览器头部的距离
 * @param { element } Object dom元素对象
 * @returns {Number} 距离
 */

export function getOffsetTop({ element }: { element: any }) {
  let actualTop = element.offsetTop
  let current = element.offsetParent

  while (current !== null) {
    actualTop += current.offsetTop
    current = current.offsetParent
  }

  return actualTop
}

/* other 其他
---------------------------------------------------------------- */
/**
 * 监听 dom元素的变化
 * @param {Boolean}  open 是否监听 ture:打开监听 false:清除监听
 * @param {String}  id 默认default
 * @param {Element}  element 盒子元素 必传
 * @param {Object}  option 参数 默认{ 'childList': true, 'arrtibutes': true}  （childList子节点 attributes属性 characterData数据 subtree后代节点 attributeOldValue改变前的目标属性值 characterDataOldValue改变之前的目标数据 attributeFilter属性列表 ）
 * @param {Function}  callback 回调 必传
 * @returns {Object} observer 观察者
 */
export function onElementChange({
  open = true,
  id = 'default',
  element,
  option = { childList: true, arrtibutes: true },
  callback,
}: {
  open?: boolean
  id?: string
  element: any
  option?: any
  callback: any
}) {
  // let MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver

  if (!window.Observer) window.Observer = {}
  let observer = window.Observer[id]

  if (observer) observer.disconnect() // 清除监听
  if (!open) return

  // dom元素
  if (typeof element == 'string') element = document.querySelector(element)

  // 创建
  observer = new MutationObserver(callback)

  // 开始
  observer.observe(element, option)

  return observer
}
